package com.hcx.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.hcx.reggie.pojo.AddressBook;
import com.hcx.reggie.service.AddressBookService;
import com.hcx.reggie.utils.BaseContext;
import com.hcx.reggie.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@RestController
@RequestMapping("/addressBook")
@CrossOrigin
public class AddressBookController {

    @Autowired
    private AddressBookService addressBookService;

    /**
     * 添加地址簿信息
     *
     * @param addressBook
     * @return
     */
    @PostMapping
    public R<AddressBook> addAddressBook(@RequestBody AddressBook addressBook) {
        addressBook.setUserId(BaseContext.getCurrentId());  // 设置地址簿所属用户的ID
        log.info("addAddressBook: {}", addressBook);  // 记录添加地址簿的信息
        addressBookService.save(addressBook);  // 调用服务保存地址簿信息
        return R.success(addressBook);  // 返回成功的响应结果
    }

    /**
     * 删除地址簿信息
     *
     * @param addressBook
     * @return
     */
    @PutMapping("default")
    public R<AddressBook> setDefaultAddressBook(@RequestBody AddressBook addressBook) {
        log.info("setDefaultAddressBook: {}", addressBook);  // 记录设置默认地址簿的信息
        LambdaUpdateWrapper<AddressBook> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        lambdaUpdateWrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());  // 设置查询条件
        lambdaUpdateWrapper.set(AddressBook::getIsDefault, 0);  // 设置查询条件
        addressBookService.update(lambdaUpdateWrapper);  // 调用服务更新地址簿信息,将地址信息的isDefault设置为0
        addressBook.setIsDefault(1);  // 设置默认地址簿,将isDefault设置为1
        addressBookService.updateById(addressBook);  // 调用服务更新地址簿信息
        return R.success(addressBook);  // 返回成功的响应结果

    }

    /**
     * 根据id查询地址簿信息
     *
     * @param id
     * @return
     */
    @GetMapping("{id}")
    public R<AddressBook> getAddressBookById(@PathVariable("id") Long id) {
        log.info("getAddressBookById: {}", id);  // 记录查询地址簿信息的ID,以日志的方式记录
        AddressBook addressBook = addressBookService.getById(id);  // 调用服务查询地址簿信息,通过id查询
        if (addressBook == null) {  // 如果查询不到地址簿信息,则返回失败的响应结果
            return R.error("查询不到该地址簿信息");
        }
        return R.success(addressBook);  // 返回成功的响应结果
    }

    /**
     * 查询默认地址簿信息
     *
     * @return
     */
    @GetMapping("default")
    public R<AddressBook> getDefaultAddressBook() {
        log.info("getDefaultAddressBook");  // 记录查询默认地址簿信息
        LambdaQueryWrapper<AddressBook> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());  // 设置查询条件
        lambdaQueryWrapper.eq(AddressBook::getIsDefault, 1);  // 设置查询条件
        AddressBook addressBook = addressBookService.getOne(lambdaQueryWrapper);  // 调用服务查询默认地址簿信息
        //Sql: SELECT * FROM address_book WHERE user_id = ? AND is_default = 1 LIMIT 1
        if (addressBook == null) {  // 如果查询不到默认地址簿信息,则返回失败的响应结果
            return R.error("查询不到默认地址簿信息");
        }
        return R.success(addressBook);  // 返回成功的响应结果
    }

    /**
     * 查询用户的所有地址簿信息
     *
     * @return
     */

    @GetMapping("list")
    public R<List<AddressBook>> listAddressBook(AddressBook address) {
        log.info("listAddressBook");  // 记录查询用户的所有地址簿信息
        address.setUserId(BaseContext.getCurrentId());  // 设置查询条件,查询当前用户的地址簿信息
        LambdaQueryWrapper<AddressBook> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(AddressBook::getUserId, address.getUserId());  // 设置查询条件
        lambdaQueryWrapper.orderByDesc(AddressBook::getUpdateTime);  // 设置排序条件,按照更新时间倒序排列
        List<AddressBook> addressBook = addressBookService.list(lambdaQueryWrapper);// 调用服务查询用户的所有地址簿信息
        //Sql: SELECT * FROM address_book WHERE user_id = ?
        if (addressBook == null) {  // 如果查询不到用户的所有地址簿信息,则返回失败的响应结果
            return R.error("查询不到用户的所有地址簿信息");
        }
        return R.success(addressBook);  // 返回成功的响应结果
    }

    /**
     * 根据id修改地址簿信息
     *
     * @param ids
     * @return
     */
    @DeleteMapping()
    public R<String> updateAddressBook(Long ids) {
        log.info("updateAddressBook: {}", ids);  // 记录修改地址簿信息的ID,以日志的方式记录
        addressBookService.removeById(ids);  // 调用服务删除地址簿信息
        return R.success("删除成功");  // 返回成功的响应结果

    }

}
